생성자(Constructor)C++에서 생성자를 이용해 객체를 생성함과 동시에 멤버 변수를 초기화 할 수 있다.
생성자는 특별한 메소드로, 클래스의 이름과 동일한 이름의 메소드로 구현된다.
생성자 초기화 도구라고 볼 수 있다.
생성자는 반환 값이 없다. 생성자를 여러 번 정의하여 다양한 방법으로 객체를 초기화 할 수 있다.
#include <iostream>
#include <string>
using namespace std;
class Character{
private:
string name;
int ragePoint;
int hp;
int damage;
public:
Character(string name, int hp, int damage){
this->name=name;
this->ragePoint=0;
this->hp=hp;
this->damage=damage;
}
void show(){
cout << name << "[" << ragePoint << "] " << hp << " " << damage << '\n';
}
};
int main(void){
Character charater= Character("슬라임", 50, 10);
charater.show();
system("pause");
return 0;
}
Character(string name, int hp, int damage){
this->name=name;
this->ragePoint=0;
this->hp=hp;
this->damage=damage;
}
Character(string name, int hp, int damage) : name(name), ragePoint(0), hp(hp), damage(damage) {}
위의 두 가지 생성자는 동일하게 초기화 동작한다.
C++의 기본 생성자별도로 생성자를 구현하지 않으면, 기본 생성자(Default Constructor)가 사용된다.
기본 생성자는 매개 변수를 가지지 않으며, 멤버 변수는 0 ,NULL등의 값으로 초기화된다.
Character character=Charater();
C++의 복사 생성자(Copy Constructor)다른 인스턴스의 참조(Reference)를 인수로 받아서, 그 참조를 사용해 자신의 인스턴스를 초기화 할수 있게 해준다.
대표적인 복사 방법인 깊은 복사 (Deep Copy)를 이용해 만들어진
인스턴스는 기존의 인스턴스와 다른 메모리 공간에 할당되어 독립적으로 존재
Character(const Character& other){
name=other.name;
ragePoint=other.ragePoint;
hp=other.hp
damage=other.damage;
}
#include <iostream>
#include <string>
using namespace std;
class Character {
private:
string name;
int ragePoint;
int hp;
int damage;
public:
Character(string name, int hp, int damage) : name(name), ragePoint(0), hp(hp), damage(damage) {}
Character(const Character& other){
name=other.name;
ragePoint=other.ragePoint;
hp=other.hp;
damage=other.damage;
}
void pointUp(){ ragePoint++; }
void show(){
cout << name << "[" << ragePoint << "] " << hp << " " << damage << '\n';
}
};
int main(void){
Character character1("슬라임", 10, 20);
character1.pointUp();
Character character2(character1);
character2.pointUp();
character1.show();
character2.show();
system("pause");
return 0;
}
소멸자(Destructor)객체의 수명이 끝났을 때, 객체를 제거하기 위한 목적으로 사용된다.
객체의 수명이 끝났을 때, 컴파일러가 소멸자 함수를 호출한다.
C++의 소멸자 또한 생성자처럼 클래스의 이름과 동일하며 물결 기호(~)를 이용해 정의할 수 있다.
~Character(){
cout<<“[객체가 소멸됩니다.]\n”;
}
#include <iostream>
#include <string>
using namespace std;
class Character {
private:
string name;
int ragePoint;
int hp;
int damage;
public:
Character(string name, int hp, int damage) : name(name), ragePoint(0), hp(hp), damage(damage) {}
~Character(){
cout << "[객체가 소멸됩니다.]\n";
}
void pointUp(){ ragePoint++; }
void show(){
cout << name << "[" << ragePoint << "] " << hp << " " << damage << '\n';
}
};
int main(void){
Character* character1=new Character("슬라임", 10, 20);
character1->pointUp();
Character character2(*character1);
character2.pointUp();
character1->show();
character2.show();
delete character1;
system("pause");
return 0;
}
슬라임[1] 10 20
슬라임[2] 10 20
[객체가 소멸됩니다.]
sh: pause: command not found
[객체가 소멸됩니다.]
Program ended with exit code: 0
이와 같이 소멸자는 자동으로 사용됨